home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / CUGUK / PROG_TOO / C023A.ZIP / PART1 / FMOD.C < prev    next >
Text File  |  1990-01-31  |  721b  |  39 lines

  1. #include <stdio.h>
  2. #include "float.h"
  3. #asm
  4. ;
  5. ;    fmod(z,x) = z-x*floor(z/x)
  6. ;        if x>0 then  0 <= fmod(z,x) < x
  7. ;        if x<0 then  x < fmod(z,x) <= 0
  8. ;
  9. QFMOD:    POP    HL    ;return addr
  10.     POP    DE    ;discard next number
  11.     POP    DE    ; (already in FA)
  12.     POP    DE
  13.     POP    DE    ;fetch next number
  14.     POP    IX    ; (1st operand, or "z")
  15.     POP    BC
  16.     PUSH    DE    ;restore stack
  17.     PUSH    DE
  18.     PUSH    DE
  19.     PUSH    DE
  20.     PUSH    DE
  21.     PUSH    DE
  22.     PUSH    HL    ;replace return addr
  23.     PUSH    DE    ;save another copy of z
  24.     PUSH    IX
  25.     PUSH    BC
  26.     CALL    PUSHFA    ;save a copy of 2nd operand ("x")
  27.     CALL    FDIV    ;z/x
  28.     CALL    QFLOOR    ;floor(z/x)
  29.     POP    BC
  30.     POP    IX
  31.     POP    DE
  32.     CALL    FMUL    ;x*floor(z/x)
  33.     POP    BC
  34.     POP    IX
  35.     POP    DE
  36. ;        to find mod(z,x)=z-x*floor(z/x), fall into...
  37.     CALL FSUB
  38. #endasm
  39.